package com.chinags.system.testingfacility.service.impl;

import com.chinags.common.core.domain.AjaxResult;
import com.chinags.common.core.text.Convert;
import com.chinags.common.exception.BusinessException;
import com.chinags.common.utils.StringUtils;
import com.chinags.common.utils.ValidationUtil;
import com.chinags.common.utils.poi.ExcelUtil;
import com.chinags.common.utils.security.Md5Utils;
import com.chinags.system.testingfacility.domain.TJcJcjg;
import com.chinags.system.testingfacility.domain.TJcJcjgZz;
import com.chinags.system.testingfacility.mapper.TJcJcjgMapper;
import com.chinags.system.testingfacility.mapper.TJcJcjgZzMapper;
import com.chinags.system.testingfacility.service.ITJcJcjgService;
import com.chinags.system.testingfacility.service.ITJcJcjgZzService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * 检测机构基本 服务层实现
 * 
 * @author liut
 * @date 2019-06-20
 */
@Service
public class TJcJcjgServiceImpl implements ITJcJcjgService 
{
	@Autowired
	private TJcJcjgMapper tJcJcjgMapper;
	@Autowired
	private TJcJcjgZzMapper tJcJcjgZzMapper;

	@Autowired
	private ITJcJcjgZzService tJcJcjgZzService;

	private static final Logger log = LoggerFactory.getLogger(TJcJcjgServiceImpl.class);
	/**
     * 查询检测机构基本信息
     * 
     * @param jcjgId 检测机构基本ID
     * @return 检测机构基本信息
     */
    @Override
	public TJcJcjg selectTJcJcjgById(Long jcjgId)
	{
	    return tJcJcjgMapper.selectTJcJcjgById(jcjgId);
	}

	/**
	 * @author 时晨星 --保存校验身份证号和信用号
	 * @param tJcJcjg
	 * @return
	 */
	@Override
	public AjaxResult saveCheck(TJcJcjg tJcJcjg){
		TJcJcjg tJcJcjgTest = new TJcJcjg();
		if(!ValidationUtil.cardCodeVerifySimple(tJcJcjg.getIdCard())){
			return AjaxResult.warn("身份证号格式错误，请仔细核对！");
		}
		tJcJcjgTest.setIdCard(tJcJcjg.getIdCard());
		if(tJcJcjgMapper.selectTJcJcjgList(tJcJcjgTest).size()>0){
			Long id = tJcJcjgMapper.selectTJcJcjgList(tJcJcjgTest).get(0).getJcjgId();
			if(!id.equals(tJcJcjg.getJcjgId())){
				return AjaxResult.warn("身份证号码重复，请仔细核对！");
			}
		}
		tJcJcjgTest.setIdCard(null);
		tJcJcjgTest.setCode(tJcJcjg.getCode());
		if(tJcJcjgMapper.selectTJcJcjgList(tJcJcjgTest).size()>0){
			String code = tJcJcjgMapper.selectTJcJcjgList(tJcJcjgTest).get(0).getCode();
			if(code.equals(tJcJcjg.getCode())){
				return AjaxResult.warn("社会统一信用代码重复，请仔细核对！");
			}
		}
		return AjaxResult.success();
	}

	/**
     * 查询检测机构基本列表
     * 
     * @param tJcJcjg 检测机构基本信息
     * @return 检测机构基本集合
     */
	@Override
	public List<TJcJcjg> selectTJcJcjgList(TJcJcjg tJcJcjg)
	{
		tJcJcjg = setJgLocation(tJcJcjg);
		return tJcJcjgMapper.selectTJcJcjgList(tJcJcjg);
	}

	/**
	 * @author 时晨星 --拆分行政区，然后分别设置省市区三个字段
	 * @param tJcJcjg
	 * @return
	 */
	public TJcJcjg setJgLocation(TJcJcjg tJcJcjg){
		if (!StringUtils.isEmpty(tJcJcjg.getDistrict())) {
			String[] location = tJcJcjg.getDistrict().split("/");
			if(location.length>0){
				tJcJcjg.setShengFirst(location[0]);
			}
			if(location.length>1){
				tJcJcjg.setShiSecond(location[1]);
			}
			if(location.length>2){
				tJcJcjg.setXianThird(location[2]);
			}
		}
		tJcJcjg.setDistrict(null);
		return tJcJcjg;
	}

    /**
     * 新增检测机构基本
     * 
     * @param tJcJcjg 检测机构基本信息
     * @return 结果
     */
	@Override
	public int insertTJcJcjg(TJcJcjg tJcJcjg)
	{
		tJcJcjg = setJgLocation(tJcJcjg);
		return tJcJcjgMapper.insertTJcJcjg(tJcJcjg);
	}
	
	/**
     * 修改检测机构基本
     * 
     * @param tJcJcjg 检测机构基本信息
     * @return 结果
     */
	@Override
	public int updateTJcJcjg(TJcJcjg tJcJcjg)
	{
		tJcJcjg = setJgLocation(tJcJcjg);
		return tJcJcjgMapper.updateTJcJcjg(tJcJcjg);
	}

	/**
     * 删除检测机构基本对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
	@Override
	public int deleteTJcJcjgByIds(String ids)
	{
		return tJcJcjgMapper.deleteTJcJcjgByIds(Convert.toStrArray(ids));
	}

	/**
	 * 导入检测数据
	 *
	 * @param jcjgList 用户数据列表
	 * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
	 * @param operName 操作用户
	 * @return 结果
	 */
	@Override
	public AjaxResult importData(List<TJcJcjg> jcjgList, Boolean isUpdateSupport, String operName)
	{
		if (StringUtils.isNull(jcjgList) || jcjgList.size() == 0)
		{
			throw new BusinessException("导入检测机构数据不能为空！");

	}

		int successNum = 0;
		int failureNum = 0;
		StringBuilder successMsg = new StringBuilder();
		StringBuilder failureMsg = new StringBuilder();
		int row=2;//用来记录Excel文件错误的行的行数
		List<TJcJcjg> logList = new LinkedList<>();//错误日志数据列表
		for (TJcJcjg jcjg : jcjgList)
		{
			TJcJcjg logData =new TJcJcjg();
			if(StringUtils.isEmpty(jcjg.getCode())){
				logData.setRow(row);
				logData.setCode("信用代码不可为空！");
			}
			if(logData.getRow()!=null){//如果该条数据格式不正确
				logList.add(logData);
				failureNum++;
				failureMsg.append("<br/>" + failureNum + "、第 " + logData.getRow() + " 行数据格式不正确");
			}
			else{
				try
				{
					TJcJcjgZz zz =tJcJcjgZzMapper.selectTJcJcjgZzByCodeAndLevel(jcjg.getCode(),jcjg.getQualification());
					if(jcjg.getQualification()!=null&&zz!=null){//检测机构资质表里，同一个单位，查询有无等级相同的数据
						zz.setQualification(jcjg.getQualification());
						zz.setPeriodStart(jcjg.getPeriodStart());
						zz.setPeriodEnd(jcjg.getPeriodEnd());
						zz.setJcjgId(jcjg.getCode());
						zz.setAgencyName(jcjg.getAgencyName());
						tJcJcjgZzService.updateTJcJcjgZz(zz);
					}
					else if(jcjg.getQualification()!=null&&zz==null){
						zz = new TJcJcjgZz();
						zz.setQualification(jcjg.getQualification());
						zz.setPeriodStart(jcjg.getPeriodStart());
						zz.setPeriodEnd(jcjg.getPeriodEnd());
						zz.setJcjgId(jcjg.getCode());
						zz.setAgencyName(jcjg.getAgencyName());
						tJcJcjgZzService.insertTJcJcjgZz(zz);
					}
					// 验证是否存在这个检测机构
					TJcJcjg jcjgFlag = tJcJcjgMapper.selectTJcJcjgByCode(jcjg.getCode());
					if (StringUtils.isNull(jcjgFlag))
					{
						jcjg.setCreateBy(operName);
						this.insertTJcJcjg(jcjg);
						successNum++;
						successMsg.append("<br/>" + successNum + "、检测机构 " + jcjg.getAgencyName() + " 导入成功");
					}
					else if (isUpdateSupport)
					{
						jcjg.setJcjgId(jcjgFlag.getJcjgId());
						jcjg.setUpdateBy(operName);
						this.updateTJcJcjg(jcjg);
						successNum++;
						successMsg.append("<br/>" + successNum + "、检测机构 " + jcjg.getAgencyName() + " 更新成功");
					}
					else
					{
						failureNum++;
						failureMsg.append("<br/>" + failureNum + "、检测机构 " + jcjg.getAgencyName() + " 已存在");
					}
				}
				catch (Exception e)
				{
					failureNum++;
					String msg = "<br/>" + failureNum + "、检测机构 " + jcjg.getAgencyName() + " 导入失败：";
					failureMsg.append(msg + e.getMessage());
					log.error(msg, e);
				}
			}
			row++;
			}
		String fileName=null;
		if (logList.size()>0){
			ExcelUtil<TJcJcjg> util = new ExcelUtil<TJcJcjg>(TJcJcjg.class);
			fileName=util.exportExcel(logList, "错误数据日志").get("msg").toString();
		}
		if (failureNum > 0)
		{
			failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
			return AjaxResult.error(failureMsg.toString(),fileName);
		}
		else
		{
			successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
		}
		return AjaxResult.success(successMsg.toString());
	}
}
